﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using GeneradorNumeroAleatorios;

namespace GeneradorNumerosPseudoAleatorio
{
    public partial class Form1 : Form
    {
        private Generador g;
        Random R;
        int banderaRandom = 0;
        int i, j;
        public Form1()
        {
            InitializeComponent();
            inahabilitar_BtnMasUno();
            dataGridView2.Rows.Clear();
            grafico.Series.Clear();
        }


        private void btnGenerar_Click(object sender, EventArgs e)
        {
            g = GeneradorNumeroAleatorios.Generador.getInstancia();
            g.ClearLista();
            limpiarGrilla();
            habilitar_BtnMasUno();
            g.valor_Semilla = !string.IsNullOrEmpty(textValSemilla.Text) ? int.Parse(textValSemilla.Text) : 4;
            g.valor_A = !string.IsNullOrEmpty(textValA.Text) ? int.Parse(textValA.Text) : 5;
            g.valor_C = !string.IsNullOrEmpty(textValC.Text) ? int.Parse(textValC.Text) : 7;
            g.valor_M = !string.IsNullOrEmpty(textValM.Text) ? int.Parse(textValM.Text) : 8;
            g.valor_N = 20;
            dataGridView1.DataSource = g.GenerarNumeroAleatorio(null);

        }

        private void checkSemilla_CheckedChanged(object sender, EventArgs e)
        {
            textValSemilla.Enabled = checkSemilla.Checked;
            textValSemilla.Text = "";
        }

        private void bntAgregar_Click(object sender, EventArgs e)
        {
            g = GeneradorNumeroAleatorios.Generador.getInstancia();
            var UltimoNumero = g.GetUltimoNumeroLista();
            limpiarGrilla();
            habilitar_BtnMasUno();
            g.valor_N = 1;
            dataGridView1.DataSource = g.GenerarNumeroAleatorio(UltimoNumero.Mostrar_Xn_1());

        }


        public void limpiarGrilla()
        {

            dataGridView1.DataSource = null;
            inahabilitar_BtnMasUno();
        }

        private void btnLimpiarGrilla_Click(object sender, EventArgs e)
        {
            limpiarGrilla();
        }

        public void habilitar_BtnMasUno()
        {

            bntAgregar.Enabled = true;
        }

        public void inahabilitar_BtnMasUno()
        {
            bntAgregar.Enabled = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var g = Generador.getInstancia();
            dataGridView1.DataSource = g.FormulaRandom(20);
        }

        private void checkValA_CheckedChanged(object sender, EventArgs e)
        {
            textValA.Enabled = checkValA.Checked;
            textValA.Text = "";
        }

        private void checkValC_CheckedChanged(object sender, EventArgs e)
        {
            textValC.Enabled = checkValC.Checked;
            textValC.Text = "";
        }

        private void checkValM_CheckedChanged(object sender, EventArgs e)
        {
            textValM.Enabled = checkValM.Checked;
            textValM.Text = "";
        }

        private bool ValidarEntrada(string valor)
        {

            return true;
        }

        private void btnGeneradorRandom_Click(object sender, EventArgs e)
        {
            g = Generador.getInstancia();
            g.valor_N = int.Parse(valor_n.Text);
            g.valor_T = int.Parse(valor_intervalo.Text);
            limpiarGrilla();
           
            dataGridView1.DataSource = g.FormulaRandom(g.valor_N);
            banderaRandom = 1;

        }

        private void button2_Click(object sender, EventArgs e)
        {
           
            try
            {
                double largo;
                dataGridView2.DataSource = null;
                grafico.Series.Clear();
                largo = calcularSubintervalos(Convert.ToInt32(valor_intervalo.Text));

                if (largo != 0)
                {
                    armarIntervalos(largo, Convert.ToInt32(valor_intervalo.Text));
                }


            }
            catch (Exception)
            {
                MessageBox.Show("No se han cargado números", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public double calcularSubintervalos(int subintervalos)
        {
            double l=0;

            if (banderaRandom == 1)
            {
                return l = (1 / (Convert.ToDouble(subintervalos)));
            }

            return l;

        }

        public void armarIntervalos(double largo, int subintervalos)
        {
            String[] intervalos = new String[subintervalos];
            int[] frecuencias = new int[subintervalos];
            int[] numeros = new int[g.GetTotalNumeros()];
            double[] NumerosRandom = new double[g.GetTotalNumeros()];

            double sumador;

            if (banderaRandom == 1)
            {
                for (i = 0; i < g.GetTotalNumeros(); i++)
                {
                    NumerosRandom[i] = g.listNumero.ElementAtOrDefault(i).Mostrar_Xn_1();
                }
                sumador = 0;

                for (i = 0; i < subintervalos; i++)
                {
                    for (j = 0; j < g.GetTotalNumeros(); j++)
                    {
                        if (NumerosRandom[j] >= sumador && NumerosRandom[j] < (sumador + largo))
                            ++frecuencias[i];
                        if (i == (subintervalos - 1) && NumerosRandom[i] == 1)
                            ++frecuencias[i];
                    }
                    intervalos[i] = Convert.ToString(sumador) + " - " + (Convert.ToString(sumador = sumador + largo));
                }

                graficarDatos(Convert.ToInt32(valor_intervalo.Text), intervalos, frecuencias);

            }

        }


        public void graficarDatos(int subintervalos, String[] intervalos, int[] frecuencias)
        {
            int[] FrecuenciasEsperadas = new int[Convert.ToInt32(valor_intervalo.Text)];
            grafico.Series.Add("Series 1");
            grafico.Series["Series 1"].Points.DataBindXY(intervalos, frecuencias);
            grafico.Series.Add("Series 2");
            for (i = 0; i <= ((Convert.ToInt32(valor_intervalo.Text)) - 1); i++)
            {
                FrecuenciasEsperadas[i] = (g.GetTotalNumeros() / Convert.ToInt32(valor_intervalo.Text));
                dataGridView2.Rows.Add(intervalos[i], frecuencias[i], FrecuenciasEsperadas[i]);
            }
            grafico.Series["Series 2"].Points.DataBindY(FrecuenciasEsperadas);
            grafico.Series["Series 1"].LegendText = "Frecuencias\n observadas";
            grafico.Series["Series 2"].LegendText = "Frecuencias\n esperadas";
        }

    }
}
